package cn.good.yan.service.t2;

import lombok.Getter;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 * 2. CompletableFuture 定义操作 - 异步任务
 * 异步回掉 ：
 * 一个案例：电商平台，list 集合，展示价格， 优化前：循环一次次查询；优化后：循环后，并发执行
 *
 * @author shengren.yan
 * @author shengren.yan
 * @create 2024-03-25
 * @create 2024-03-25
 */
public class CompletableFuture3 {

    // 有哪些网站平台 - 列表
    static List<NetMall> list = Arrays.asList(
            new NetMall("jd"),
            new NetMall("taobao"),
            new NetMall("pdd"));

    /**
     * 循环一次次查询 （优化前）
     */
    public static List<String> getPrice(List<NetMall> list, String productName) {
        // 返回的格式":《mysql》 在 网站平台 价格是 90.43 (%s 是占位符，第一个参数，%.2f是第二个参数，保留2位小数)
        return list
                .stream()
                .map(item ->
                        String.format(productName + " 在 %s 价格是 %.2f",
                                item.getNetMallName(),
                                item.calcPrice(productName)))
                .collect(Collectors.toList());
    }

    /**
     * 并发执行 （优化后）
     */
    public static List<String> getPriceB(List<NetMall> list, String productName) {
        return list.stream().map(netMall ->
                        CompletableFuture.supplyAsync(() -> String.format(productName + " 在 %s 价格是 %.2f",
                                netMall.getNetMallName(),
                                netMall.calcPrice(productName))))
                .collect(Collectors.toList())
                .stream()
                .map(CompletableFuture::join)
                .collect(Collectors.toList());
    }


    // 验证
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        // 参数1：总数据，参数2：商品
        List<String> list1 = getPrice(list, "mysql");
        for (String element : list1) {
            System.out.println(element);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("----优化前: " + (endTime - startTime) + " 毫秒");

        System.out.println("--------------------");

        long startTime2 = System.currentTimeMillis();
        List<String> list2 = getPriceB(list, "mysql");
        for (String element : list2) {
            System.out.println(element);
        }
        long endTime2 = System.currentTimeMillis();
        System.out.println("----优化后: " + (endTime2 - startTime2) + " 毫秒");
    }
    
}

// 网站类
class NetMall {
    @Getter
    private String netMallName; // 类型：是来源于 京东、拼多多、淘宝

    public NetMall(String netMallName) {
        this.netMallName = netMallName;
    }

    // 该产品的价格 （随机生成的数值）
    public double calcPrice(String productName) {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 线程安全的随机数，是Double类型
        // ThreadLocalRandom.current().nextInt(10) 这个是int类型
        return ThreadLocalRandom.current().nextDouble() * 2 + productName.charAt(0);
    }
}
